#include <iostream>
#include "imagenes.h"
#include "spline.h"

using namespace std;
void limpiarLinea(vector<double>&, int, int);

int main(int argc,char** argv)
{
	Imagen* img;
	if(argc>3)
		img =new Imagen(argv[1],argv[2],argv[3]);
	else
		img =new Imagen(argv[1],argv[2]);
    Matriz* laImagenAModificar=img->dameLaMatrizDeLaImagen();
    coordenada inicio = img->dameCoordenadaInicio();
    coordenada fin = img->dameCoordenadaFin();
    vector<double> linea(laImagenAModificar->cantidadDeColumnas());
    for(Indice i=inicio._ejeY;i<=fin._ejeY;i++)
    {
        laImagenAModificar->dameFila(linea,i);
        //hacer lo del spline con el vector linea y guardar esos datos en ese mismo vector
        limpiarLinea(linea, inicio._ejeX-1, fin._ejeX-1);
        laImagenAModificar->reemplazarFila(linea,i);
    }
    img->escribirImagen();
    if(argc>3)
    	cout<<img->errorCuadraticoMedio()<<endl;
    return 0;
}


void limpiarLinea(vector<double>& linea, int desde, int hasta)
{
	int i, n;
	n= linea.size()-(hasta-desde)-1;
	vector<double> valores(n), indice(n);

	for (i = 0; i < n; i++) {
		if (i<desde)
			indice[i]= i;
		else
			indice[i]= i + (hasta-desde) + 1;
		valores[i]= linea[(int)indice[i]];
	}
	
	
	vector< vector<double> > miSpline;
	spline(indice,valores,miSpline);
	
	for (i = desde; i <= hasta; i++){
		int valor= (int)calcularValor(miSpline,i - (desde-1), desde-1);
		valor=  (valor>0) ? valor : 0;
		valor=  (valor<255) ? valor : 255;
		linea[i]=valor;
	}
}
